<?php
/**
 * Arquivo de declaração da classe ControleException
 * @package controlador
 * @author Jose Berardo
 * @author Túlio Carvalho
 * @version 1.0
 */

/**
 * Exceção geral de fluxo do controlador
 * 
 * @package controlador
 */
class ControleException extends Exception {
  /**#@+
   * @var int
   */
  const MODULO_INEXISTENTE        = 1;
  const ACAO_INEXISTENTE          = 2;
  const ACAO_PROTEGIDA            = 3;
  const PARAMETROS_INSUFICIENTES  = 4;
  /**#@-*/
  const VISAO_INEXISTENTE         = 5;
  
  /**
   * Construtor da Exceção
   *
   * @param int $codigo
   */
  public function __construct($codigo) {
    $mensagem = "";
    switch ($codigo) {
      case self::MODULO_INEXISTENTE:
        $mensagem = "A classe referente ao módulo " .
				 "requisitado não foi encontrada!";
        break;
      case self::ACAO_INEXISTENTE:
        $mensagem = "Ação selecionada não foi declarada " .
                    "no módulo!";
        break;
      case self::ACAO_PROTEGIDA:
        $mensagem = "Ação de uso interno, não deve " .
                    "ser chamada diretamente!";
        break;
      case self::PARAMETROS_INSUFICIENTES:
        $mensagem = "O número de parâmetros informados " .
                    "na URL não é suficiente para " . 
                    "executar esta ação!";
        break;
      case self::VISAO_INEXISTENTE:
        $mensagem = "A visão selecionada não foi " .
                    "encontrada em " . VISAO;
        break;
    }
    parent::__construct($mensagem, $codigo);
  }
  
  /**
   * Método estático que irá capturar qualquer exceção
   *
   * @param Exception $excecao
   */
  public static function capturar($excecao) {
    $capturar = $detalhar = $depurar = "";
    $dados_ambiente =
           Controlador::getInstancia()->get('dados_ambiente');
    if($dados_ambiente['excecoes']['capturar']==4){
    	include VISAO.DS."webcontent".DS."404.php";
    	exit();
    }
    switch ($dados_ambiente['excecoes']['capturar']) {
      // --------------------------------------    	
    	case 3: // Depurar
        $depurar  = "<h4>Exceção gerada no arquivo: " . 
                    $excecao->getFile() .
                    " - Na linha: " . $excecao->getLine() .
                    "</h4>\n" .
                    "<h4>Fonte do arquivo</h4>".
				 "<div style='background-color: #EEEEEE; " .
                    "padding: 10px; " . 
                    "border: 1px dashed #000000; margin: 3px " .
				 "display: block'><pre>";
        $fonte     = explode("<br />",
                     highlight_file($excecao->getFile(), true));
        $fonte_str = "";
        foreach($fonte as $linha => $valor) {
          $linha++;
          if ($linha == $excecao->getLine()) {
            $fonte_str .= sprintf("<b " . 
                                  "style='background-color: " . 
                                  "#DDDDDD'>" . 
                                  "<span style='color: " . 
                                  "#000000'>%03d:</span> " .
                                  "%s</span></b>\n", $linha, 
                                  $valor);
          } else {
            $fonte_str .= sprintf("<span style='color: " . 
                                  "#000000'>%03d:</span>" .
                                  "%s\n", $linha, $valor);
          }
        }
        $depurar .= "$fonte_str</pre></div>\n";
      case 2: // Detalhar
        $detalhar = "<h4>Detalhes da pilha</h4>".
                    "<div style='background-color: #EEEEEE; " . 
                    "padding: 10px; " . 
                    "white-space: pre; border: 1px dashed " . 
                    "#000000; margin: 3px'>" . 
                    $excecao->getTraceAsString() . "</div>\n";    
      case 1: // Capturar
        $capturar = "<h2>Fácil MVC</h2>" .  
                    "<h3>Exceção Capturada</h3>" .  
                    "<h4>" . $excecao->getCode() . " - " . 
                    $excecao->getMessage() . "</h4>\n"; 
        break;
      // --------------------------------------
      case 0: // Não capturar
        // Relançamento da exceção
        throw $excecao;
        break;
    }    
    echo $capturar;
    echo $detalhar;
    echo $depurar;
    exit();
  }
}
?>
